package course05

/**
  * 匿名函数
  */
object FunctionApp {

  def main(args: Array[String]) {



    /**
      *  1 :List(txt)                   ===  得到一个List集合
      *       List(hello world hello world hello world hello world)
      *  2 :l.flatMap(_.split(" "))     ===  按照 " " 拆分，然后水平化处理得到一个集合；flatMap = flatten+map
      *       List(hello, world, hello, world, hello, world, hello, world)
      *  3 :.map(x =>(x,1))             === 把每一个元素变成 => (元素，1)
      *       List((hello,1), (world,1), (hello,1), (world,1), (hello,1), (world,1), (hello,1), (world,1))
      *  4 :.groupBy(_._1)              === //每一个map,按照它的第一个元素(_1) 分组， 例子（hello,1)._1 就是hello,然后按hello分组
      *      Map(world -> List((world,1), (world,1), (world,1), (world,1)), hello -> List((hello,1), (hello,1), (hello,1), (hello,1)))
      *  5 :.map(x=>(x._1,(x._2).size)) === 把集合中的元素第一个值，变成(值,个数)  例子：hello -> List((hello,1), (hello,1))) -> (hello,2)
      */

    val txt = scala.io.Source.fromFile("C:\\Users\\Administrator\\Desktop\\work\\hello.txt").mkString
    val l = List(txt)

    println("**"+l)
    val result = l.flatMap(_.split("\t"))
                          .map(x =>(x,1))
                               .groupBy(_._1)
                                    .map(x=>(x._1,(x._2).size))
    println("统计结果"+result)






//    //下面用Scala完成词频统计 ----
//    val mapList = l.flatMap(_.split(" ")).map(x =>(x,1))
//    //  == List((hello,1), (world,1), (hello,1), (world,1), (hello,1), (world,1), (hello,1), (world,1))
//
//    //生成 ： <k,1>
//    // Map(world -> List((world,1), (world,1), (world,1), (world,1)), hello -> List((hello,1), (hello,1), (hello,1), (hello,1)))
//    val groupList = mapList.groupBy(_._1)
//    println("groupBy(_._1)  :  "+groupList)
//
//    //Map(world -> 4, hello -> 4)
//    val list4 = groupList.map(x=>(x._1,(x._2).size))
















//    val l = List(1,3,5,7)
//    //map 函数， 就是对集合每一个元素操作,y = f(x);
//    println(l.map((x:Int)=> x*2))      //List(2, 6, 10, 14)    注意，List没变
//    println(l.map(x=> x*2))            //List(2, 6, 10, 14)   如果只有一个元素，可以不加括号
//    println(l.map(_*2))                //List(2, 6, 10, 14)    这个是大佬写的代码
//
//    println(l.map(_*2).filter(_>8))    //List(10, 14)    过滤功能
//    println(l.take(2))                 //List(1, 3)  取前两个
//
//    // reduce = rereduceLeft
//    println("l.reduce(_+_) =  "+l.reduce(_+_))             //两两相加    ((1+3)+5)+7
//    println("l.reduce(_-_) =  "+l.reduce(_-_))             //两两相减    ((1-3)-5)-7
//    println("l.reduceLeft(_-_) =  "+l.reduceLeft(_-_))     //两两相减    ((1-3)-5)-7
//    println("l.reduceRight(_-_) =  "+l.reduceRight(_-_))   //两两相减    1-(3-(5-7))
//
//    //  fold  = foldLeft  需要初始种子
//    println("l.fold(_-_) =  "+l.fold(0)(_-_))              //两两相减    (((0-1)-3)-5)-7
//    println("l.foldLeft(_-_) =  "+l.foldLeft(0)(_-_))      //两两相减    (((0-1)-3)-5)-7
//    println("l.foldRight(_-_) =  "+l.foldRight(0)(_-_))    //两两相减    1-(3-(5-(7-0)))
//
//    //  求 和，最大值，最小值
//    println("求和："+l.sum+"   最小值："+l.min+"   最大值："+l.max)
//
//    //  合并集合  , 不会去重
//    val f = List(List(1,2),List(3,4),List(3,4),List(5,6))
//    println("合并以后的集合1："+f.flatten)                //List(1, 2, 3, 4, 3, 4, 5, 6)
//    println("合并以后的集合2："+f.map(_.map(_*2)))        //List(List(2, 4), List(6, 8), List(6, 8), List(10, 12)
//    println("合并以后的集合3："+f.flatMap(_.map(_*2)))    //List(2, 4, 6, 8, 6, 8, 10, 12)



  }





}
